package com.tchhy.provider.net.interceptor

import com.tchhy.basemodule.common.BaseApplication
import okhttp3.Interceptor
import okhttp3.Response
import okhttp3.CacheControl
import com.tchhy.basemodule.utils.NetWorkUtils
import okhttp3.Request
import java.util.concurrent.TimeUnit


/**
 * 判断当前网络是否有效,如果有效,则创建一个请求.
 * 该请求能获取一个10秒内未过期的缓存,否则强制获取一个缓存(过期了30天也允许).
 * 而CacheNetworkInterceptor主要是在缓存没命中的情况下,请求网络后,修改响应头头,加上Cache-Control,告知OKHTTP对该请求进行一个60秒的缓存.
 *
 * OKHttp缓存数据缓存，比如Json，如果我们需要保存文件需要重新下载文件，比如Glide使用本地缓存将图片保存至本地，本项目就是用OKHttp+Glide作为缓存
 * 接下来需要做POST缓存，由于OKHttp不支持POST缓存；
 *
 *
 * 我们在网络拦截器修改响应头信息，例如：Cache-Control = 60，一般做缓存操作就在CacheInterceptor中，所以我们需要把拦截器添加到网络拦截器
 *
 * 其实相当于服务器告知客户端我这些数据需要缓存60s，过了60s就要请求服务器
 *
 * <p>
 * Author: wfy
 *
 *
 */
class CacheInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val resp: Response
        val req: Request
        if (NetWorkUtils.isNetWorkAvailable(BaseApplication.context)) {
            //有网络,检查10秒内的缓存
            req = chain.request()
                    .newBuilder()
                    .cacheControl(CacheControl.Builder()
                            .maxAge(10, TimeUnit.SECONDS)
                            .build())
                    .build()
        } else {
            //无网络,检查30天内的缓存,即使是过期的缓存
            req = chain.request().newBuilder()
                    .cacheControl(CacheControl.Builder()
                            .onlyIfCached() // 强制读取缓存
                            .maxStale(30, TimeUnit.DAYS)
                            .build())
                    .build()
        }
        resp = chain.proceed(req)
        return resp.newBuilder().build()
    }
}